#include "serialthread.h"

SerialThread::SerialThread(QString port, long baud, QString stop,int data, QString check)
{
    myport = port;
    myBaud = baud;
    mystop = stop;
    mydata = data;
    mycheck = check;
}

//线程运行函数
void SerialThread::run()
{
    serial = new QSerialPort;
    //设置串口名
    serial->setPortName(myport);
    //打开串口
    if(false == serial->open(QIODevice::ReadWrite))
    {
        emit sendmsgbox();//发送弹出警告框信号
        serial->clear();
        serial->close();
        serial->deleteLater();
        return ;
    }
    qDebug() << "open OK";
    //设置波特率
    setBaudRate();
    //设置停止位
    setStopBits();
    //设置数据位数
    setDataBits();
    //设置校验位
    setCheckBits();
    //设置流控制
    serial->setFlowControl(QSerialPort::NoFlowControl);

    //连接信号槽,串口有数据时再接收
    connect(serial, SIGNAL(readyRead()), this, SLOT(read_serial_data()), Qt::QueuedConnection);//有数据就读
//    QObject::connect(serial,&QSerialPort::readyRead,this,&MainWindow::ReadData);
}

//读取串口数据
void SerialThread::read_serial_data()
{
    QByteArray temp = serial->readAll();
    QByteArray buf;
    char t = 0;

    int index = 0;
    int speed = 0;
    int data0 = 0;
    int data1 = 0;
    int data2 = 0;
    int data3 = 0;

    //接收数据解析部分(按照协议解析)
    if(!temp.isEmpty())
    {
        for(int i=0; i < temp.count(); i++)
        {
            if(temp.at(i) == '$')
            {
                buf.clear();
                t = 1;
            }

            if(t)
            {
                t++;
                buf.append(temp.at(i));

                if(t == 25)
                {
                    if(temp.at(i) == '#')
                    {
                        qDebug()  << "data:" << buf;
                        sscanf_s(buf,"$%d,%d,%d,%d,%d,%d#",&index,&speed,&data0,&data1,&data2,&data3);
                        emit senddata(buf,index,data0,data1,data2,data3);//发送数据给主线程
                    }
                    t = 0;
                }
            }
//            else
//            {
//                emit senderrordata(temp.at(i));
//            }
        }
    }
}

//线程关闭
void SerialThread::close_mthread_serial(void)
{
    qDebug() <<"close ok"<<endl;

    serial->clear();

    serial->close();//关闭子线程

    serial->deleteLater();
}

//设置波特率
void SerialThread::setBaudRate()
{
    switch (myBaud)
    {
        case 9600:
            serial->setBaudRate(QSerialPort::Baud9600);
            break;
        case 19200:
            serial->setBaudRate(QSerialPort::Baud19200);
            break;
        case 38400:
            serial->setBaudRate(QSerialPort::Baud38400);
            break;
        case 57600:
            serial->setBaudRate(QSerialPort::Baud57600);
            break;
        case 115200:
            serial->setBaudRate(QSerialPort::Baud115200);
            break;
        default:
            break;
    }
}

//设置停止位
void SerialThread::setStopBits()
{
    if(mystop == "1")
    {
        serial->setStopBits(QSerialPort::OneStop);
//        qDebug()<<ui->StopBox->currentText()<<endl;
    }
    else if(mystop == "1.5")
    {
        serial->setStopBits(QSerialPort::OneAndHalfStop);
    }
    else if(mystop == "2")
    {
        serial->setStopBits(QSerialPort::TwoStop);
    }
}

//设置数据位
void SerialThread::setDataBits()
{
    switch (mydata)
    {
        case 5:
            serial->setDataBits(QSerialPort::Data5);
            break;
        case 6:
            serial->setDataBits(QSerialPort::Data6);
            break;
        case 7:
            serial->setDataBits(QSerialPort::Data7);
            break;
        case 8:
            serial->setDataBits(QSerialPort::Data8);
            break;
        default:
            break;
    }
}

//设置校验位
void SerialThread::setCheckBits()
{
    if(mycheck == "Nocheck")
    {
        serial->setParity(QSerialPort::NoParity);
    }
    else if(mycheck == "Evencheck")
    {
        serial->setParity(QSerialPort::EvenParity);
    }
    else if(mycheck == "Oddcheck")
    {
        serial->setParity(QSerialPort::OddParity);
    }
}


